package jp.aztech.android.kawasakiwelfare;

import java.util.ArrayList;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 写真の ImageView
 * スクロールすると、表示される写真が切替る
  * モックアップなので、予め用意された写真を使用する
 */
public class PhotoView extends ImageView {
	private final static String TAG  = "PhotoView";

	/* 拡張子 */
	private final static String EXT_JPG = ".jpg";
	private final static String EXT_GIF = ".gif";
	private final static String EXT_PNG = ".png";

	/* スクロールの状態 */		
	private static final int SCROLL_NONE = 0;
    private static final int SCROLL_LEFT = 1;
    private static final int SCROLL_RIGHT = 2;

	/* 移動した距離のしきい値 */
    private final static  int SENSITIVITY_SCROLL = 20;
	private final static  int SENSITIVITY_FLING = 20;

	/* Context */				
	private Context mContext;

	/* GestureDetector */	
	private GestureDetector mGestureDetector;
	
	/* Context */
	private Resources mResources; 
	
	/* タイトルの TextView */	  
	private TextView mTextViewTitle;

	/* 画像とタイトルのリスト */	
	private ArrayList<Bitmap> bitmapList = new ArrayList<Bitmap>();
	private ArrayList<String> titleList = new ArrayList<String>();
	
	/* リストの数 */	
	private int list_max = 0;
 
	/* リストのポインタ */	
	private int list_pointer = 0;  	

    /* package name */  	   
    private String packageName = null; 
    
    /* スクロールしたかのフラグ */      
	private boolean scroll_flag = false;
	
	/* スクロールの状態 */  
    private int scroll_mode = SCROLL_NONE;

	/**
	 * ===コンストラクタ ===
	 */  	         
    public PhotoView(Context context) {
        super(context);
        initView(context);    
    }

	/**
	 * ===コンストラクタ ===
	 */  
    public PhotoView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

	/**
	 * ===コンストラクタ ===
	 */      
    public PhotoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }

	/**
	 * 初期設定；写真情報の読出し
	 */    
     private void initView(Context context) {
         mContext = context;
    	 mResources = context.getResources();   	
    	 packageName = context.getPackageName();

		// GestureDetector を開始する 
    	 mGestureDetector = new GestureDetector( context, new MyGestureListener() );
    }

 	/**
 	 * タイトルの TextView を設定する
 	 */ 
     public void setTextViewTitle( TextView v ) {
 		mTextViewTitle = v;
 	}

 	/**
 	 * 開始
 	 */ 
     public void start() {   	  
		// 写真情報を読出し、リストに設定する   	 
    	 String[] lines = readFile();
    	 if ( lines != null ) {
		    initList( lines );
    	 }

     	// 写真を表示する
      	drawPhoto();
 	}
     
	/**
	 * 写真情報を Assets ファイルから読出す
	 */		
    private String[] readFile() {
    	FileUtility file = new FileUtility( mContext );
    	return file.readAssetsFileLines( "photo.txt" );
    }

	/**
	 * リストを設定する
	 * ファイル名から Bitmap を取得し、リストに登録する
	 */	
    private void initList( String[] lines ) {
        int j = 0;
 		
        // 写真情報を順にリストに登録する
    	for ( int i = 0; i < lines.length; i++ ) {
    	 	String str = lines[ i ];
 			String[] cols = str.split(",");
 			Bitmap b = getBitmapByName( cols[0] );
 			
 			// Bitmap が取得できれば、リストに登録する
 			if ( b != null ) {
 				bitmapList.add( j, b );
    			titleList.add( j, cols[1] );
    			j ++;
    		}
    	}
        list_max = j - 1;
	}

	/**
	 * ファイル名から Bitmap を取得する
	 */	
 	private Bitmap getBitmapByName( String name ) {
    	Log.d(TAG , "getBitmapByName " + name);
    	
		// 拡張子を削除する 			 
 		if ( name.endsWith( EXT_JPG ) ) {
 			name = name.replaceAll( EXT_JPG, "" );
 		} else if ( name.endsWith( EXT_GIF ) ) {
 			name = name.replaceAll( EXT_GIF, "" );
 		} else if ( name.endsWith( EXT_PNG ) ) {
 			name = name.replaceAll( EXT_PNG, "" );
 		}

		// ファイル名から リソースID を取得する 		 	
		int id = mResources.getIdentifier( name, "drawable", packageName );
 		if ( id == 0 ) {
			return null;
		}
 				
		// リソースID から Bitmap を取得する 		
		return BitmapFactory.decodeResource( mResources, id );
	}

	/**
	 * 前の写真を表示する
	 */ 			
    private void prevPhoto() {
    	list_pointer --;
		if ( list_pointer < 0 ) {
			list_pointer = list_max;
		}
    	drawPhoto();
    }

	/**
	 * 次の写真を表示する
	 */ 	
    private void nextPhoto() {
    	list_pointer ++;
		if ( list_pointer > list_max) {
			list_pointer = 0;
		}
    	drawPhoto();
    }

	/**
	 * 写真を表示する
	 */      
 	private void drawPhoto() { 	
 		// スクロールしたものを元に戻す
		scrollTo( 0, 0 );	
 		scroll_flag = false;
 				
		// リストから bitmap を取得する
 		setImageBitmap( bitmapList.get( list_pointer ) );
	    mTextViewTitle.setText( titleList.get( list_pointer ) );	
    } 

    /**
	 * === onTouchEvent ===
	 */  	
   @Override
    public boolean onTouchEvent(MotionEvent event) {
    	Log.d(TAG , "onTouchEvent");

    	// GestureDetector に委譲する
        boolean result = mGestureDetector.onTouchEvent(event); 

    	// downのとき、スクロールしていれば、写真の表示を更新する
        if ((event.getAction() == MotionEvent.ACTION_UP) && scroll_flag) {

            switch (scroll_mode) {           		
				// 左スクロールなら、前の写真を表示する
            	case SCROLL_LEFT:
            		prevPhoto();
            		break;
            		
            	// 右スクロールなら、次の写真を表示する
            	case SCROLL_RIGHT:
            		nextPhoto();
            		break;            		

            	case SCROLL_NONE:
            	default:
            		break;
            }
        }

        return result;
    }

	/**
	 *  Gesture Listener のクラス
	 */
    private class MyGestureListener extends SimpleOnGestureListener {

		/**
		 *  === onFling ===
		 * フリングしたら、写真の表示を更新する
		 */
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float x, float y) {
			Log.d(TAG , "onFling");

			// しきい値以上に移動してなければ、何もしない            
            int dx = (int) ( e2.getX() - e1.getX() );
			if ( Math.abs(dx) < SENSITIVITY_FLING ) {
                super.onFling(e1, e2, x, y);
                return false;
            }            

            // 右スクロールなら、次の写真を表示する
			if (x < 0) {
				nextPhoto();
				
			// 左スクロールなら、前の写真を表示する
        	} else if (x > 0) {
    			prevPhoto();
        	}
			
			return true;    
        }

		/**
		 *  === onScroll ===
		 * スクロールした分だけ写真を移動する
		 */
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float x, float y) {
			Log.d(TAG , "onScroll");			
	            
			scroll_flag = true;	     
    		int dx = (int) (e1.getRawX() - e2.getRawX());	
    		
    		// 右にスクロール
    		if ( dx < - SENSITIVITY_SCROLL ) {
        		scroll_mode = SCROLL_RIGHT;
				scrollBy( (int) x, 0 );
				
			// 左にスクロール
    		} else if ( dx > SENSITIVITY_SCROLL ) {
        		scroll_mode = SCROLL_LEFT;
				scrollBy( (int) x, 0 );
				
			// しきい値以上に移動してなければ、何もしない  
    		} else {
        		scroll_mode = SCROLL_NONE;
    		}
       
    		return true;
        }

		/**
		 *  === onDown ===
		 *  未使用
		 */
    	@Override
    	public boolean onDown(MotionEvent envent) {
    		Log.d(TAG , "onDown");
    		super.onDown(envent);
    		// true にしないと、onFling が呼ばれない
    		return true;
    	}

		/**
		 *  === onSingleTapUp ===
		 *  未使用
		 */ 
    	@Override
    	public boolean onSingleTapUp(MotionEvent envent) {
    		Log.d(TAG , "onSingleTapUp");
    		super.onSingleTapUp(envent);
    		return true;
    	}

		/**
		 *  === onLongPress ===
		 *  未使用
		 */  
    	@Override
    	public void onLongPress(MotionEvent envent) {
    		Log.d(TAG , "onLongPress");
    		super.onLongPress(envent);
    	}

		/**
		 *  === onShowPress ===
		 *  未使用
		 */       
    	@Override
    	public void onShowPress(MotionEvent envent) {
    		Log.d(TAG , "onShowPress");
    		super.onShowPress(envent);
    	}
    
    }
    /* MyGestureListener end */
}